import akshare as ak
import pandas as pd
import os
from datetime import datetime

from my_const import MARKET_SENTIMENT_CSV
from util.log_util import get_the_logger

logger = get_the_logger(__name__)


def get_chinese_fear_greed_index():
    """
    获取A股恐慌指数数据
    如果有缓存数据且是最新的，则使用缓存数据
    否则从API获取新数据并保存到CSV
    """
    # 确保data目录存在
    os.makedirs(os.path.dirname(MARKET_SENTIMENT_CSV), exist_ok=True)

    # 检查是否存在缓存文件
    if os.path.exists(MARKET_SENTIMENT_CSV):
        # 读取缓存数据
        df_cached = pd.read_csv(MARKET_SENTIMENT_CSV)
        df_cached['date'] = pd.to_datetime(df_cached['date'])

        # 检查最新数据是否是今天
        if not df_cached.empty:
            latest_date = df_cached['date'].max()
            today = pd.to_datetime(datetime.now().date())

            # 如果最新数据是今天，则直接返回缓存数据
            if latest_date.date() == today.date():
                logger.info("使用缓存的恐慌指数数据")
                return df_cached

    # 从API获取最新数据
    try:
        logger.info("从API获取恐慌指数数据")
        df = ak.index_option_50etf_qvix()

        # 确保日期列是datetime类型
        df['date'] = pd.to_datetime(df['date'])

        # 保存到CSV文件
        df.to_csv(MARKET_SENTIMENT_CSV, index=False)
        logger.info(f"恐慌指数数据已保存到 {MARKET_SENTIMENT_CSV}")

        return df
    except Exception as e:
        logger.error(f"获取恐慌指数数据失败: {e}")
        # 如果API获取失败但有缓存数据，返回缓存数据
        if os.path.exists(MARKET_SENTIMENT_CSV):
            logger.info("API获取失败，使用缓存数据")
            df_cached = pd.read_csv(MARKET_SENTIMENT_CSV)
            df_cached['date'] = pd.to_datetime(df_cached['date'])
            return df_cached
        else:
            raise e


def get_fear_greed_data_for_chart(time_range='all'):
    """
    获取用于图表展示的恐慌指数数据
    只返回日期和收盘价
    """
    df = get_chinese_fear_greed_index()
    
    # 根据时间范围过滤数据
    if time_range != 'all':
        # 确保日期列是datetime类型
        df['date'] = pd.to_datetime(df['date'])
        
        # 计算时间范围的起始日期
        end_date = df['date'].max()
        if time_range == '1m':
            start_date = end_date - pd.DateOffset(months=1)
        elif time_range == '3m':
            start_date = end_date - pd.DateOffset(months=3)
        elif time_range == '1y':
            start_date = end_date - pd.DateOffset(years=1)
        elif time_range == '3y':
            start_date = end_date - pd.DateOffset(years=3)
        else:
            start_date = df['date'].min()  # 默认使用全部数据
            
        # 过滤数据
        df = df[df['date'] >= start_date]

    # 确保日期列是datetime类型
    df['date'] = pd.to_datetime(df['date'])

    # 只保留需要的列
    df_chart = df[['date', 'close']].copy()

    # 转换日期格式
    df_chart['date'] = df_chart['date'].dt.strftime('%Y-%m-%d')

    # 转换为字典列表格式，便于前端使用
    data = df_chart.to_dict('records')

    return data